package Classroom.A0510.abatractPra;

public class AbstractPra {
    public static void main(String[] args) {
        Car car = new Bus();
        car.speedUp();
        car.speedDown();
    }
}

/**
 * 抽象类： 只能作为父类使用的 一个 类，不能单独使用(直接实例化)
 *      abstract : 抽象
 *          类：  抽象类 ,具有类的所有特性,可以定义抽象方法
 *          方法： 抽象方法，只有方法的声明，没有实现,只能通过子类重写
 */
abstract class Car{
    double speed = 50;
    void speedUp(){
        speed += 10;
        System.out.println(speed);
    }
    //抽象方法   提供一个约束
    abstract void speedDown();
}

//一个类继承 抽象类 后, 必须 重写 抽象类中的抽象方法
class Bus extends Car{
    @Override
    void speedDown() {
        speed -= 15;
        System.out.println(speed);
    }
}

//操作汽车
class CarOpe{

    //操作方法    声明一个父类类型的引用变量作为形参
    //调用时，可以根据需要赋予不同的对象
    void opeCar2(Car car){
        car.speedUp();
        car.speedDown();
    }

    public static void main(String[] args) {
        new CarOpe().opeCar2(new Bus());
    }
}

/**
 * 继承： 限制： 单继承   A  继承 B C D 不允许
 * 接口：为了弥补单继承的缺陷，开发了接口 interface
 *      接口中定义的是操作约束
 *      简化代码、提供复用性、可读性、便于程序解耦
 */
